/* Copyright (c) 2021 OceanBase and/or its affiliates. All rights reserved.
miniob is licensed under Mulan PSL v2.
You can use this software according to the terms and conditions of the Mulan PSL v2.
You may obtain a copy of Mulan PSL v2 at:
         http://license.coscl.org.cn/MulanPSL2
THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
See the Mulan PSL v2 for more details. */

//
// Created by Wangyunlai on 2024/05/29.
//

#pragma once

#include "common/value.h"
#include "common/rc.h"

class Aggregator
{
public:
  virtual ~Aggregator() = default;

  virtual RC accumulate(const Value &value) = 0;
  virtual RC evaluate(Value &result)        = 0;

protected:
  Value value_;
  int   cnt_     = 0;
  bool  is_null_ = true;
};

class SumAggregator : public Aggregator
{
public:
  // 这是对每一行的数据做了什么处理
  RC accumulate(const Value &value) override;
  // 可以理解为最后对数据做的处理
  RC evaluate(Value &result) override;
};

class CountAggregator : public Aggregator
{
public:
  // 这是对每一行的数据做了什么处理
  RC accumulate(const Value &value) override;
  // 可以理解为最后对数据做的处理
  RC evaluate(Value &result) override;
};

class AvgAggregator : public Aggregator
{
public:
  // 这是对每一行的数据做了什么处理
  RC accumulate(const Value &value) override;
  // 可以理解为最后对数据做的处理
  RC evaluate(Value &result) override;
};

class MaxAggregator : public Aggregator
{
public:
  // 这是对每一行的数据做了什么处理
  RC accumulate(const Value &value) override;
  // 可以理解为最后对数据做的处理
  RC evaluate(Value &result) override;
};

class MinAggregator : public Aggregator
{
public:
  // 这是对每一行的数据做了什么处理
  RC accumulate(const Value &value) override;
  // 可以理解为最后对数据做的处理
  RC evaluate(Value &result) override;
};
